# import math
# import numpy as np
# from fastdtw import fastdtw  # 简化DTW实现，需pip install fastdtw
#
# def calculate_angle(a, b, c):
#     """a,b,c为三个点的坐标(x,y)，计算∠abc的角度（申报书3.1中提到的核心关节角度）"""
#     # 转为二维坐标（忽略z，简化计算）
#     a = np.array(a[:2])
#     b = np.array(b[:2])
#     c = np.array(c[:2])
#     radians = np.arctan2(c[1]-b[1], c[0]-b[0]) - np.arctan2(a[1]-b[1], a[0]-b[0])
#     angle = np.abs(np.degrees(radians))
#     return angle if angle <= 180 else 360 - angle
#
# def get_core_angles(coords):
#     """获取八大核心关节的角度（申报书3.1），返回字典 { 关节名: 角度 }"""
#     angles = {}
#     # 左膝角度（左髋、左膝、左脚踝）
#     if 23 in coords and 25 in coords and 27 in coords:  # 对应MediaPipe的LANDMARK_ID
#         angles['left_knee'] = calculate_angle(coords[23], coords[25], coords[27])
#     # 右膝角度（右髋、右膝、右脚踝）
#     if 24 in coords and 26 in coords and 28 in coords:
#         angles['right_knee'] = calculate_angle(coords[24], coords[26], coords[28])
#     # 补充其他关节（肩、肘等，参考申报书3.1）
#     return angles
#
# def cosine_similarity(vec1, vec2):
#     """计算两个特征向量的余弦相似度（申报书3.2）"""
#     return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
#
# def dtw_align(user_sequence, standard_sequence):
#     """用DTW对齐用户动作序列与标准序列（解决时长差异，拟解决问题1）"""
#     # user_sequence: 用户动作的角度序列 [ [a1,a2,...], [a1,a2,...], ... ]
#     # standard_sequence: 标准动作的角度序列（从模板库加载）
#     distance, path = fastdtw(user_sequence, standard_sequence)
#     # 返回对齐后的路径（用于后续帧匹配）
#     return path
#
# def recognize_action(smoothed_coords, standard_template, user_history):
#     """整合逻辑：提取当前帧特征→与标准模板匹配→返回动作类型及相似度"""
#     # 1. 提取当前帧特征（核心关节角度）
#     current_angles = get_core_angles(smoothed_coords)
#     current_vec = np.array(list(current_angles.values()))  # 转为向量
#     # 2. 加入用户历史序列（用于DTW）
#     user_history.append(current_vec)
#     user_history = user_history[-30:]  # 保留最近30帧（约1秒）
#     # 3. 与标准模板匹配（标准模板从data/models/加载，格式参考申报书2.2的JSON）
#     if len(user_history) < 10:  # 序列过短时不匹配
#         return "识别中...", 0.0
#     # 简化：用最近10帧与标准模板的前10帧计算相似度
#     standard_vecs = standard_template['angle_sequences'][:10]
#     similarity = cosine_similarity(np.mean(user_history[-10:], axis=0), np.mean(standard_vecs, axis=0))
#     # 4. 判定动作类型（如深蹲、站立）
#     if similarity > 0.75:
#         return standard_template['action_name'], similarity
#     else:
#         return "动作不匹配", similarity
